﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;

using System.Data.SqlClient;
using System.ComponentModel;
using System.Web.UI.WebControls;

namespace GPS.COMMON
{
    public class GPS_Library
    {
        #region "DataTable Extend"

        //public DataTable ToDataTable<T>(IList<T> lst)
        //{
        //    //'//Tạo một DataTable từ T
        //    DataTable table = this.CreateTable<T>();
        //    //'Lấy danh sách Property của T
        //    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
        //    //'Lặp qua IList , gán giá trị của các thuộc tính có tên = tên cột trong Datatable vừa tạo
        //    foreach (T item in lst)
        //    {
        //        //'Tạo một row mới 
        //        DataRow row = table.NewRow();
        //        //'Duyệt qua Property, đồng thời gán giá trị cho column
        //        foreach (PropertyDescriptor prop in properties)
        //        {
        //            table.Columns.Cast<DataColumn>().ToList().ForEach(c =>
        //            {
        //                if (c.ColumnName == prop.Name)
        //                {
        //                    row[c.ColumnName] = prop.GetValue(item) ?? DBNull.Value;

        //                }
        //            });
        //        }
        //        //'thêm mới một row vào table
        //        table.Rows.Add(row: row);
        //    }
        //    return table;
        //}


        #endregion

        #region "List and Object Extend"
        public static List<T> MapDataTableToList<T>(DataTable dt)
        {
            if (dt == null)
            {
                return null;
            }

            List<T> list = new List<T>();

            foreach (DataRow dr in dt.Rows)
            {
                list.Add(MapDataRowToObject<T>(dr));
            }

            return list;
        }

        public static T MapDataRowToObject<T>(DataRow dr)
        {
            if (dr == null)
            {
                return default(T);
            }

            T instance = Activator.CreateInstance<T>();

            PropertyInfo[] properties = instance.GetType().GetProperties();

            if ((properties.Length > 0))
            {

                foreach (PropertyInfo propertyObject in properties)
                {
                    bool valueSet = false;


                    foreach (object attributeObject in propertyObject.GetCustomAttributes(false))
                    {
                        if (object.ReferenceEquals(attributeObject.GetType(), typeof(MapperColumn)))
                        {
                            MapperColumn columnAttributeObject = (MapperColumn)attributeObject;


                            if ((columnAttributeObject.ColumnName != string.Empty))
                            {

                                if (dr.Table.Columns.Contains(columnAttributeObject.ColumnName) && (!object.ReferenceEquals(dr[columnAttributeObject.ColumnName], DBNull.Value)))
                                {
                                    propertyObject.SetValue(instance, dr[columnAttributeObject.ColumnName], null);

                                    valueSet = true;

                                }

                            }
                        }
                    }

                    if (!valueSet)
                    {
                        if (dr.Table.Columns.Contains(propertyObject.Name) && !object.ReferenceEquals(dr[propertyObject.Name], DBNull.Value))
                        {
                            propertyObject.SetValue(instance, dr[propertyObject.Name], null);

                        }
                    }

                }
            }

            return instance;
        }

        public static List<T> ToList<T>(params T[] arrT)
        {
            return new List<T>((T[])arrT);
        }


        #endregion

        #region "Enum"
        public enum ParameterDirect
        {
            Input = 1,
            InOutPut = 2,
            OutPut = 3,
            ReturnValue = 4
        }

        public enum DataProvider
        {
            SqlServer = 1,
            OleDb = 2,
            Odbc = 3,
            MySql = 4,
            Oracle = 5
        }


        public enum GTTSqlType
        {
            GTTDecimal = SqlDbType.Decimal,
            GTTBigInt = SqlDbType.BigInt,
            GTTBit = SqlDbType.Bit,
            GTTInt = SqlDbType.Int,
            GTTSmallInt = SqlDbType.SmallInt,
            GTTReal = SqlDbType.Real,
            GTTDate = SqlDbType.Date,
            GTTDateTime = SqlDbType.DateTime,
            //GTTLong = SqlDbType.Float
            GTTNVarchar = SqlDbType.NVarChar,
            GTTVarchar = SqlDbType.VarChar,
            GTTFloat = SqlDbType.Float
        }

        #endregion

        #region "Properties"
        [AttributeUsage(AttributeTargets.Property)]
        private class MapperColumn : Attribute
        {


            private string mColumnName;
            public MapperColumn(string columnName)
            {
                mColumnName = columnName;
            }

            public string ColumnName
            {
                get { return mColumnName; }
                set { mColumnName = value; }
            }
        }
        #endregion
    }
}
